/**
 * @description 事件发布订阅
 * @author zhangming
 * @createTime 2022/05/17
 */
class EventCenter {
    constructor () {
        this.eventMap = {}
    }
    /**
     * @description 事件订阅
     * @param { String } eventName 事件名称
     * @param { Function } eventCallback 事件处理函数
     * @returns { undefined }
     */
    subscribe (eventName, eventCallback) {
        // 初始化事件对象
        this.eventMap[eventName] = this.eventMap[eventName] || []
        // 防止同一事件重复注册
        if (this.eventMap[eventName].indexOf(eventCallback) === -1) {
            // 事件未注册, 注册事件
            this.eventMap[eventName].push(eventCallback)
        }
    }
    /**
     * @description 取消事件订阅
     * @param { String } eventName 事件名称
     * @param { Function | undefined } eventCallback 
     */
    unSubcribe (eventName, eventCallback) {
        if (!this.eventMap[eventName]) return 
        if (!eventCallback) {
            // 没有指定处理函数 直接删除所有处理函数 
            return delete this.eventMap[eventName]
        }
        const index = this.eventMap[eventName].indexOf(eventCallback)
        if (index > -1) this.eventMap[eventName].splice(index, 1)
    }
    /**
     * @description 清空事件
     */
    clear () {
        this.eventMap = {}
    }
    /**
     * @description 事件派发
     * @param { String } eventName 事件名称
     * @param { any } params 事件携带的参数
     * @returns { undefined }
     */
    dispatch (eventName, params) {
        const eventList = this.eventMap[eventName]
        if (eventList && eventList.length) {
            eventList.forEach(cb => {
                if (cb && typeof cb === 'function') cb(params)
            });
        }
    }
}

export default EventCenter